package com.itheima.mp.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserMapper extends BaseMapper<User> {
    /*  MyBatisPlus使用的基本流程是什么？
        1.引入MybatisPlus依赖，代替Mybatis依赖
        2.定义Mapper接口并继承BaseMapper
        3.在实体类上添加注解声明 表信息
        4.在application.yml中根据需要添加配置


        MyBatisPlus通过扫描实体类，并基于反射获取实体类信息作为数据库表信息
        UserMapper在继承BaseMapper的时候指定了一个泛型：泛型中的User就是与数据库对应的PO.
        MybatisPlus就是根据PO实体的信息来推断出表的信息，从而生成SQL的。默认情况下：
        - MybatisPlus会把PO实体的类名驼峰转下划线作为表名
        - MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名，并根据变量类型推断字段类型
        - MybatisPlus会把名为id的字段作为主键
        但很多情况下，默认的实现与实际场景不符，因此MybatisPlus提供了一些注解便于我们声明表信息。
        MybatisPlus中比较常用的几个注解如下：
        @TableName：用来指定表名
        @TableId：用来指定表中的主键字段信息
        @TableField：用来指定表中的普通字段信息

        IdType枚举：
            AUTO：数据库自增长
            INPUT：通过set方法自行输入
            ASSIGN_ID：分配 ID，接口IdentifierGenerator的方法nextId来生成id，默认实现类为DefaultIdentifierGenerator雪花算法
        使用@TableField的常见场景：
            成员变量名与数据库字段名不一致
            成员变量名以is开头，且是布尔值
            成员变量名与数据库关键字冲突
            成员变量不是数据库字段


     */


    /*
    总结：在什么情况下，怎么使用MP中提供的Service和Mapper中的方法？
    对于一些简单的方法，可以直接在controller里调用MP提供的Service方法，无需任何自定义Service或Mapper。
    当业务逻辑相对复杂，需要自己写一些业务，而MP只提供基本的增删改查，没有业务，此时需要自定义Service方法，并且在其中编写业务逻辑。
    当BaseMapper或Service提供的方法不足以满足增删改查的需求时，需要编写mapper，自定义SQL语句。
    */



    void updateBalanceByIds(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("amount") int amount);


    @Update("UPDATE tb_user SET balance = balance - #{money} WHERE id = #{id}")
    void dedectBalance(@Param("id") Long id, @Param("money") Integer money);


}
